# main.py
import importlib
import os
import sys
from typing import List, Type



def scan_classes(package_path: str, base_class: Type) -> List[Type]:
    """
    扫描指定包路径下所有继承自 base_class 的类
    :param package_path: 包的路径（如 "services"）
    :param base_class: 基类，用于筛选目标类
    :return: 符合条件的类列表
    """
    # 确保包路径在 sys.path 中（方便导入）
    package_dir = os.path.abspath(package_path)
    print(package_dir)
    if package_dir not in sys.path:
        sys.path.append(package_dir)

    target_classes = []

    # 递归遍历包目录
    for root, dirs, files in os.walk(package_dir):
        # 排除 __pycache__ 等目录
        dirs[:] = [d for d in dirs if not d.startswith("__")]

        for file in files:
            # 只处理 .py 文件，排除 __init__.py
            if file.endswith(".py") and not file.startswith("__"):
                # 构建模块名（如 "services.user_service"）
                relative_path = os.path.relpath(root, package_dir)
                if relative_path == ".":
                    module_name = file[:-3]  # 移除 .py 后缀
                else:
                    module_name = f"{relative_path.replace(os.sep, '.')}.{file[:-3]}"

                try:
                    # 动态导入模块
                    module = importlib.import_module(module_name)

                    # 遍历模块中的所有成员，筛选符合条件的类
                    for attr_name in dir(module):
                        attr = getattr(module, attr_name)
                        # 检查是否是类、是否继承自 base_class、且不是 base_class 本身
                        if (
                                isinstance(attr, type)
                                and issubclass(attr, base_class)
                                and attr != base_class
                        ):
                            target_classes.append(attr)
                except Exception as e:
                    print(f"导入模块 {module_name} 失败: {e}")

    return target_classes


# 使用示例
if __name__ == "__main__":
    from app.view.base_view import View
    view_classes = scan_classes("../view", View)

    # 打印结果
    print("自动加载的类：")
    for cls in view_classes:
        print(f"- {cls.__name__} (模块: {cls.__module__})")

    # 实例化并使用
    # if view_classes:
    #     service = view_classes[0]()
    #     print(service.get_user(123))
    #